package org.demo.base.proxy.dynamicproxy;

import org.demo.base.proxy.dynamicproxy.impl.StudentServiceImpl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 *
 * 1.获取USerDao对象，在UserDao调用save()方法时添加代理业务
 * 2.新的业务不再执行原有业务
 *
 * 总结：JdK动态代理在获取对象时生成一个代理对象，代理对象对方法的处理可以在InvocationHandler中处理
 *  参数：newProxyInstance(ClassLoader classLoader,Class[] classes, InvocationHandler invocationHandler)
 *         classLoader：类加载器 没有限制方法所在类即可
 *         classes:被代理类的接口class数组
 *         invocationHandler：方法调用拦截实现，完成方法调用时代理业务
 *
 *
 *         public Object invoke(Object proxy, Method method, Object[] args)
 *
 *
 *         proxy：生成的代理对象不可进行操作处理
 *         method：被代理对象方法对象
 *         args：调用方法时的参数
 *         Object：返回值，即为方法的返回值
 *
 */
public class CustomProxyTest {


    public static void main(String[] args) {
        IStudentService studentService = getStudentService();
        studentService.study();
        studentService.work();
    }



    public static IStudentService getStudentService(){
        final StudentServiceImpl studentService = new StudentServiceImpl();

        return (IStudentService) Proxy.newProxyInstance(CustomProxyTest.class.getClassLoader(), new Class[]{IStudentService.class}, new InvocationHandler() {
            // return 返回的对象为方法返回对象
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                String name = method.getName();
                if("study".equals(name)){
                    System.out.println("study 方法体修改。。。。。");
                    return null;
                }else{
                    Object invoke = method.invoke(studentService, args);
                    return invoke;
                }
            }
        });
    }
}
